//-----------------------------------------
// 	PicOS Project
//
// 	HEPIA 2014 - Florent Gluck
//
//	Denis Voirol		Pierre Kiss
//	Ruben Magnin		Alina Stanculescu
//	Sebastien Beureux	Julien Cornut
//-----------------------------------------
//
//	picofsadd.c
//
//	add file in file system
//	
//-----------------------------------------

#include <stdio.h>
#include <math.h>
#include <libgen.h>
#include <string.h>
#include "fs.h"

int main(int argc, char *argv[])
{
	//Verification arguments
	if(argc != 5)
	{
        printf("Usage : fs_add file_system_name file_name\n");
        return 1;
    }

	int i,j;
	
	//Ouverture fichiers
	FILE *fs = fopen(argv[1], "r+");
	FILE *source = fopen(argv[4], "r");

	if (fs != NULL && source != NULL)
	{
		//Remplit structure file_entry
		file_entry fe;

		memset(&fe, 0, sizeof(file_entry));					//Initialisation a 0

		
 		fe.attribut = (atoi(argv[2])/10)*16+(atoi(argv[2]))%10;
		fe.uid = atoi(argv[3]);
		
		strcpy(fe.name, basename(argv[4])); 				//Nom

		fseek(source, 0, SEEK_END);
		fe.size = ftell(source);							//Taille

		int nb_sectors = ceil((float)fe.size/SECTOR_SIZE);
		char bits,new_bits;
		int k = 0;
		for (i=0; i<BITMAP_SIZE; i++)
		{
			bits = fgetc(fs);
			for (j=7; j>=0; j--)							//Parcourt bitmap bit a bit
			{
				char mask = (1<<j);
				if ((mask&bits) == 0)
				{
					bits |= mask;
					fseek(fs, ftell(fs)-1, SEEK_SET);		//Replace pointeur
					fputc(bits, fs);						//MAJ bitmap

					fe.sect_index[k] = i*8+8-j;				//MAJ index secteurs
					k++;
					if (k == nb_sectors)					//Si chaque secteur indexe
					{
						goto end_loop;
					}
				}
			}
		}
		if (k < nb_sectors)
		{
			printf("Espace insuffisant. Fichier non copie.\n");
			goto end;
		}
		end_loop:
	

		//Trouve premier file entry libre
		fseek(fs, FILES_ENTRY_OFFSET, SEEK_SET);
		int file_index = FILES_ENTRY_OFFSET;
		while (fgetc(fs) != 0)
		{
			fseek(fs, SECTOR_SIZE-1, SEEK_CUR);
			file_index = ftell(fs);
			if (file_index >= FILE_CONTENT_OFFSET)
			{
				printf("Nombre de fichier maximal atteint. Fichier non copie.\n");
				return -1;
			}
		}
	
		//Ecrit file entry
		fseek(fs, file_index, SEEK_SET);
		fwrite(&fe, 1, sizeof(file_entry), fs);

		//Insere fichier dans secteurs
		int c;
		fseek(source, 0, SEEK_SET);							//Debut du fichier source
		for (i=0; i<nb_sectors; i++)
		{
			fseek(fs, FILE_CONTENT_OFFSET+(fe.sect_index[i]-1)*SECTOR_SIZE, SEEK_SET);
			for (j=0; j<SECTOR_SIZE && ((c=fgetc(source))!=EOF); j++)
			{
				fputc(c, fs);
			}
		}
			//Fermeture fichiers
		fclose(fs);
		fclose(source);
	}
	else
	{
		printf("Erreur dans le nom des fichiers.\n");
		return -1;
	}end:

	//Fin du programme
	return 0;
}
